package references

import (
	"JVM/Jvmgo/GoToJVM/instructions/base"
	"JVM/Jvmgo/GoToJVM/runtimeData"
	"JVM/Jvmgo/GoToJVM/runtimeData/heap"
)

// 创建一个新对象
type NEW struct {
	base.Index16Instruction
}

func (self *NEW) Execute(frame *runtimeData.Frame) {
	cp := frame.Method().Class().ConstantPool()
	classRef := cp.GetConstant(self.Index).(*heap.ClassRef)
	class := classRef.ResolvedClass()
	if !class.InitStarted() {
		// 将指针复位到当前指令
		frame.RevertNextPC()
		//
		base.InitClass(frame.Thread(), class)
		return
	}
	// 接口和抽象类不能被实例化
	if class.IsInterface() || class.IsAbstract() {
		panic("java.lang.InstantiationError")
	}
	// 将对象引用推到操作栈栈顶
	ref := class.NewObject()
	frame.OperandStack().PushRef(ref)
}
